using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using snat.algorithms;
using algorithms.algorithms.Example;
using algorithms.algorithms.MessageRates;
using algorithms.algorithms.EventRankAlgorithm;
using algorithms.algorithms.PageRankAlgorithm;
using algorithms.algorithms.SimpleLinkPrediction;
using algorithms.Utils.Metrics;
using algorithms.algorithms.EdgeClusteringAlgorithm;
using snat.model;


namespace algorithms {
    public sealed partial class AlgorithmSet {

        /*
         * User should add their algorithms here to register it with the GUI
         */
        private void UserInit() {

            // Message Rates
            Add("Quarterly Global Message Rates", new GlobalMessageRate(new TimeSpan(28 * 4, 0, 0, 0)));
            Add("Weekly Global Message Rates", new GlobalMessageRate(new TimeSpan(7, 0, 0, 0)));
            Add("Daily Global Message Rates", new GlobalMessageRate(new TimeSpan(1, 0, 0, 0)));

            // Clustering
            Add("Edge Betweenness Clustering", new EdgeClustering());

            // Centrality
            Add("EventRank", new EventRank());
            Add("PageRank", new PageRank());

            // Link prediction / ranking
            Add("Common Neighbours Link Prediction", new LocalLinkPrediction<int>(LinkPredictionMetrics.CommonNeighbors));
            Add("Jaccard's Coefficient Link Prediction", new LocalLinkPrediction<double>(LinkPredictionMetrics.JaccardsCoefficient));
            Add("Adamic Adar Link Prediction", new LocalLinkPrediction<double>(LinkPredictionMetrics.AdamicAdar));
            Add("Preferential Attachment Link Prediction", new LocalLinkPrediction<int>(LinkPredictionMetrics.PreferentialAttachment));
            Add("Cossim Link Prediction", new LocalLinkPrediction<double>(LinkPredictionMetrics.CosineSimilarity));

            // ROC CURVE VALIDATORS OF STUFF
            Add("Common Neighbours Verifier", new LinkPredictionVerifier<int>(LinkPredictionMetrics.CommonNeighbors, 3042));
            Add("Jaccard's Coefficient Verifier", new LinkPredictionVerifier<double>(LinkPredictionMetrics.JaccardsCoefficient, 3042));
            Add("Adavmic Adar Verifier", new LinkPredictionVerifier<double>(LinkPredictionMetrics.AdamicAdar, 3042));
            Add("Preferential Attachment Verifier", new LinkPredictionVerifier<int>(LinkPredictionMetrics.PreferentialAttachment, 3042));
            Add("Cossim Verifier", new LinkPredictionVerifier<double>(LinkPredictionMetrics.CosineSimilarity, 3042));

            // Example Algorithm From User Guide
            Add("Multi-recipient Message Count", new MultiRecipientMessageCounter());

        }

    }
}